home *** CD-ROM | disk | FTP | other *** search
/ Aminet 39 / Aminet 39 (2000)(Schatztruhe)[!][Oct 2000].iso / Aminet / gfx / misc / Splitmpeg.lha / Splitmpeg / src / util.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-07-22  |  5.0 KB  |  236 lines

  1. /*
  2.  * Copyright (c) 1992 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  *
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  *
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * I can be contacted via
  22.  * Email: michael@ecel.uwa.edu.au
  23.  * Post: P.O. Box 506, NEDLANDS WA 6009, AUSTRALIA
  24.  *
  25.  * Amigaversion by Tobias Seiler in 1997
  26.  * Email: tabs@blader.com
  27.  */
  28.  
  29. #include "main.h"
  30. #include "proto.h"
  31.  
  32. /*
  33.  *--------------------------------------------------------------
  34.  *
  35.  * correct_underflow --
  36.  *
  37.  * Called when buffer does not have sufficient data to
  38.  *      satisfy request for bits.
  39.  *      Calls get_more_data, an application specific routine
  40.  *      required to fill the buffer with more data.
  41.  *
  42.  * Results:
  43.  *      None really.
  44.  *
  45.  * Side effects:
  46.  * buf_length and buffer fields in curVidStream structure
  47.  *      may be changed.
  48.  *
  49.  *--------------------------------------------------------------
  50.  */
  51.  
  52. void correct_underflow()
  53. {
  54.  
  55.   int status;
  56.  
  57.   status = get_more_data( buf_start, max_buf_length, &bufLength, &bitBuffer);
  58.  
  59.   if (status  < 0) {
  60.     longjmp(env,ERR_READ_BITSTREAM);
  61.  
  62.   }
  63.   else if ((status == 0) && (bufLength < 1)) {
  64.     longjmp(env,ERR_UNEXPECTED_EOF);
  65.  
  66.   }
  67.  
  68.   curBits = *bitBuffer;
  69. }
  70.  
  71. /*
  72.  *--------------------------------------------------------------
  73.  *
  74.  * next_bits --
  75.  *
  76.  * Compares next num bits to low order position in mask.
  77.  *      Buffer pointer is NOT advanced.
  78.  *
  79.  * Results:
  80.  * TRUE, FALSE, or error code.
  81.  *
  82.  * Side effects:
  83.  * None.
  84.  *
  85.  *--------------------------------------------------------------
  86.  */
  87.  
  88. int next_bits(int num, unsigned int mask)
  89. {
  90.   unsigned int stream;
  91.   int ret_value;
  92.  
  93.   /* If no current stream, return error. */
  94.  
  95.   if (BitStream == NULL)
  96.   longjmp(env,ERR_NO_BIT_STREAM);
  97.  
  98.   /* Get next num bits, no buffer pointer advance. */
  99.  
  100.   show_bitsn(num, &stream);
  101.  
  102.   /* Compare bit stream and mask. Set return value toTRUE if equal, FALSE if
  103.      differs.
  104.   */
  105.  
  106.   if (mask == stream) {
  107.     ret_value = TRUE;
  108.   }
  109.   else ret_value = FALSE;
  110.  
  111.   /* Return return value. */
  112.  
  113.   return ret_value;
  114. }
  115.  
  116. /*
  117.  *--------------------------------------------------------------
  118.  *
  119.  * next_start_code --
  120.  *
  121.  * Parses off bitstream until start code reached. When done
  122.  *      next 4 bytes of bitstream will be start code. Bit offset
  123.  *      reset to 0.
  124.  *
  125.  * Results:
  126.  * Status code.
  127.  *
  128.  * Side effects:
  129.  * Bit stream irreversibly parsed.
  130.  *
  131.  *--------------------------------------------------------------
  132.  */
  133.  
  134. int next_start_code(void)
  135. {
  136.   int state;
  137.   int byteoff;
  138.   unsigned int data;
  139.  
  140.   /* If no current stream, return error. */
  141.  
  142.   if (BitStream == NULL)
  143.   longjmp(env,ERR_NO_BIT_STREAM);
  144.  
  145.   /* If insufficient buffer length, correct underflow. */
  146.  
  147.   if (bufLength < 2) {
  148.     correct_underflow();
  149.   }
  150.  
  151.   /* If bit offset not zero, reset and advance buffer pointer. */
  152.  
  153.   byteoff = bitOffset % 8;
  154.  
  155.   if (byteoff != 0) {
  156.     bitOffset += (8-byteoff);
  157.     if (bitOffset > 31) {
  158.       bitBuffer++;
  159.       curBits = *bitBuffer;
  160.       bufLength--;
  161.       bitOffset = 0;
  162.     }
  163.   }
  164.  
  165.   /* Set state = 0. */
  166.  
  167.   state = 0;
  168.  
  169.   /* While buffer has data ... */
  170.  
  171.   while(bufLength > 0) {
  172.  
  173.     /* If insufficient data exists, correct underflow. */
  174.  
  175.     if (bufLength < 2) {
  176.       correct_underflow();
  177.     }
  178.  
  179.     /* If next byte is zero... */
  180.  
  181.     get_bits8(&data);
  182.  
  183.     if (data == 0) {
  184.  
  185.       /* If state < 2, advance state. */
  186.  
  187.       if (state < 2) state++;
  188.     }
  189.  
  190.     /* If next byte is one... */
  191.  
  192.     else if (data == 1) {
  193.  
  194.       /* If state == 2, advance state (i.e. start code found). */
  195.  
  196.       if (state == 2) state++;
  197.  
  198.       /* Otherwise, reset state to zero. */
  199.  
  200.       else state = 0;
  201.     }
  202.  
  203.     /* Otherwise byte is neither 1 or 0, reset state to 0. */
  204.  
  205.     else {
  206.       state = 0;
  207.     }
  208.  
  209.     /* If state == 3 (i.e. start code found)... */
  210.  
  211.     if (state == 3) {
  212.  
  213.       /* Set buffer pointer back and reset length & bit offsets so
  214.   next bytes will be beginning of start code.
  215.       */
  216.  
  217.       bitOffset = bitOffset - 24;
  218.  
  219.       if (bitOffset < 0) {
  220.         bitOffset = 32 + bitOffset;
  221.         bufLength++;
  222.         bitBuffer--;
  223.         curBits = *bitBuffer;
  224.       }
  225.  
  226.       /* Return success. */
  227.  
  228.       return OK;
  229.     }
  230.   }
  231.  
  232.   /* Return underflow error. */
  233.  
  234.   return BUF_UNDERFLOW;
  235. }
  236.